线上 MySQL 慢查询(Slow Query)是性能排查的高频切入点,但靠登录服务器手工 grep 慢日志效率极低、难以沉淀规律。本模块介绍如何通过开源日志检索系统 ELK 构建 MySQL 慢日志收集及分析平台,让慢日志从"手工排查"走向"集中检索、常态化治理"。
ELK、EFK 有共同的组件,它们的差异主要体现在日志采集层选用的工具不同:
而缩写中的 L 与 F 代表不同的采集工具:
| 工具 | 定位 | 特点 |
|---|---|---|
| Logstash | 搜集、分析、过滤日志 | 功能强大,资源消耗高 |
| Beats(Filebeat) | 轻量级日志采集器 | 内存 CPU 消耗低,性能好 |
| Fluentd | 日志收集、处理、转发 | 轻量级,生态丰富 |
Beats 家族除 Filebeat 外,还有 Packetbeat(网络数据)、Metricbeat(指标)、Winlogbeat(Windows 日志)等成员,各针对一类数据。Kafka 则是高并发日志场景下附加的关键组件(缩写中的 K),提供分布式消息队列缓冲能力。
"L 还是 F?加不加 K?"是 ELK 搭建最常见的抉择。核心判断依据是数据规模与性能诉求:
上图给出了选型决策逻辑:中小规模且资源受限时优先 Filebeat 这类轻量采集器;单客户端需要复杂过滤清洗时可换更强大的 Logstash;一旦日志量达到上百 T 甚至 P 级,就必须在 Filebeat 与 Logstash 之间插入 Kafka 做缓冲削峰,避免高峰期日志洪峰冲垮下游存储。无论走哪条路,最终都汇入 Elasticsearch 存储并由 Kibana 呈现。
从简单到高阶,ELK 通常经历三个演进阶段,各阶段组件与复杂度递增:
以引入 Kafka 的中大型架构为例,日志从产生到检索的完整链路如下:
上图展示了中大型架构的日志流转:Filebeat 从目标节点采集原始日志后先进 Kafka 暂存,起到削峰与解耦作用;Logstash 作为消费者从 Kafka 拉取数据,完成解析、提取与过滤后写入 Elasticsearch;最终用户在 Kibana 上按时间与关键字检索。缓冲层 Kafka 的存在使采集速率与存储吞吐解耦,是海量日志场景下保障平台稳定性的关键。
落到"收集 MySQL 慢日志"这一具体场景,流程可拆解为"MySQL 落地慢日志 → Filebeat 采集 → 写 ES → Kibana 检索"四步:
上图对应本项目的落地链路:先确保 MySQL 开启慢查询并设置阈值与日志路径,让慢语句落地到指定日志文件;Filebeat 通过 filebeat modules enable mysql 激活 MySQL 插件并核对 slowlog 路径后采集该文件;数据推送至 Elasticsearch 建索引;最后由 Kibana 的 Discover 页面按时间周期加 slow.query 过滤器快速检索,从而把慢日志分析从"临时命令和脚本"升级为"可持续回溯的检索系统"。
# 1. 导入官方认证 key 并配置官方源
# 在 /etc/yum.repos.d 下新建 elk.repo 配置官方 yum 源
# 2. 安装 Elasticsearch
yum install elasticsearch -y
# 3. 修改网络监听地址(暴露给采集端)
# 编辑 /etc/elasticsearch/elasticsearch.yml
# 将 network.host 改为本地网卡接口地址
# 4. 启动并校验
systemctl start elasticsearch
systemctl status elasticsearch
curl http://<IP>:9200 # 返回包含版本信息的 JSON 即表示运行正常
# 5. 浏览器访问 Kibana 管理界面
# http://<IP>:5601# 0. 先配置 Elastic 官方 yum 源(同服务端第 1 步)
# 1. 安装 Filebeat 采集器
yum install filebeat -y
# 2. 修改 filebeat.yml,指定输出方式为 Elasticsearch
# 填写 ES 主机地址(集群模式需写多个主机端口)
# 3. 激活 MySQL 日志插件并确认
filebeat modules enable mysql
filebeat modules list # 应看到 mysql 模块已启用
# 4. 修改模块配置,让 slowlog 路径与 MySQL 慢日志路径对齐
# 编辑 /etc/filebeat/modules.d/mysql.yml 中的 slowlog 路径
# 5. 在 MySQL 中开启慢查询并设置阈值
set global slow_query_log='ON'; # 开启慢查询
set global long_query_time=1; # 大于 1 秒的记录
# 并设置慢日志文件路径
# 6. 模拟慢查询验证推送
select sleep(5); # 制造一条大于 1 秒的慢查询
# 观察 filebeat 推送窗口出现日志即表示成功推送到 ES打开 Kibana 后台的 Discover 页面:选择时间周期,添加 filter 过滤器并输入 slow.query 关键字,即可查看对应时间周期内的 MySQL 慢日志记录与图表。相比临时命令和脚本分析,检索系统让慢日志分析变得快速、高效、可回溯。
slowlog 路径必须与 MySQL 慢日志实际路径完全对齐,路径不一致会直接导致采集不到任何数据,这是本项目最高频的报错点。network.host 若仍为默认的 localhost,Filebeat 无法跨主机连上 ES,必须改为本地网卡接口地址并确保端口可通。long_query_time 而未将 slow_query_log 置为 ON,慢日志文件不会持续生成,导致"以为在采、其实没数据"。ELK 选型要点:中小规模用 Logstash 或 Filebeat 直采 ES;海量日志必须引入 Kafka 做缓冲削峰。落地上注意三点:Filebeat 的 slowlog 路径要与 MySQL 慢日志路径对齐、ES 的 network.host 要暴露给采集端、Kibana 用过滤器沉淀常用检索条件。检索效率提升后,慢日志分析才能从"应急排查"走向"常态化治理"。